package com.javastudy.liuhouse.lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class LambdaUse2 {

    @Test
    public void Lambda1(){
        //使用Lambda表达式 就可以不用编写  FunctionalInterface接口的实现类,从而简化代码
        Integer[] arr = new Integer[]{5 , 3 , 4 ,1 , 2};
        //第一个参数必须是数组
        Arrays.sort(arr , (s1 , s2) -> {
            return s1.compareTo(s2);
        });
        for (Integer i : arr){
            System.out.println(i);
        }
    }

    /*
    * 实际上,除了lambda表达式,我们还可以直接传入方法用用
    * */
    @Test
    public void lambda2(){
        String array[] = new String[]{"Apple" , "Orange" , "Banana" , "Lemon"};
        Arrays.sort(array , LambdaUse2::cmp);
        System.out.println(String.join(", " , array));
    }

    //定义一个比较的方法
    static int cmp(String s1 , String s2){
        return s1.compareTo(s2);
    }


    @Test
    public void lambda3(){
        String array[] = new String[]{"Apple" , "Orange" , "Banana" , "Lemon"};
        Arrays.sort(array , String::compareTo);
        System.out.println(String.join(", " , array));
    }


    /**
     * 构造方法引用
     */
    @Test
    public void lambdaConstructor(){
        //一个例子：如果要把一个List<String> 转化为 List<Person> 应该怎么办
        //1.定义一个字符串类型的列表 List.of  这个方法是java9引入的
        //java8 Arrays.asList    对应 java9  List.of
        List<String> names = Arrays.asList("Bob" , "Apple" , "Orange" , "Banana" , "Lemon");

        //先使用传统的方式做
        //先定义一个  ArrayList<Person> , 然后用 for 循环填充这个List
//        ArrayList<Person> persons = new ArrayList<>();
//        for(String name : names){
//            persons.add(new Person(name));
//        }
//        System.out.println(persons);


        //使用更加简单的转化  可以使用  lambda表达式
        //先使用   后面再说细节的事情

        List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
        System.out.println(persons);

    }



}
